import { httpGet, httpPost } from '@/utils/http'
import axios from 'axios'
import qs from 'qs'

// 创建一个包含默认配置的axios实例
const axiosInstance = axios.create({
  withCredentials: true, // 确保跨域请求时携带cookie
  headers: {
    'Content-Type': 'application/json',
    'X-Requested-With': 'XMLHttpRequest'
  }
})

// 配置qs序列化选项，确保中文正确编码
const qsOptions = {
  charset: 'utf-8',
  arrayFormat: 'brackets'
}

/**
 * 获取评价列表
 * @param params 查询参数
 * @returns 评价列表
 */
export const getReviewList = (params?: any) => {
  return httpGet('/api/review/listAll.do', params)
}

/**
 * 根据酒店名称获取评价列表
 * @param hotelName 酒店名称
 * @returns 评价列表
 */
export const getReviewsByHotel = (hotelName: string) => {
  return httpGet('/api/review/listByHotel.do', { hotelName })
}

/**
 * 根据用户ID获取评价列表
 * @param userId 用户ID
 * @returns 评价列表
 */
export const getReviewsByUser = (userId: string) => {
  return httpGet('/api/review/listByUser.do', { userId })
}

/**
 * 创建评价
 * @param data 评价数据
 * @returns 创建结果
 */
export const createReview = (data: any) => {
  console.log('添加评论，原始参数：', data)
  
  // 深度检查参数
  if (!data) {
    console.error('添加评论失败：参数为空')
    return Promise.reject(new Error('参数不能为空'))
  }
  
  if (!data.userId) {
    console.error('添加评论失败：用户ID为空')
    return Promise.reject(new Error('用户ID不能为空'))
  }
  
  if (!data.hotelName) {
    console.error('添加评论失败：酒店名称为空')
    return Promise.reject(new Error('酒店名称不能为空'))
  }
  
  if (!data.content || !data.content.trim()) {
    console.error('添加评论失败：评论内容为空')
    return Promise.reject(new Error('评论内容不能为空'))
  }
  
  if (data.rating === undefined || data.rating === null) {
    console.error('添加评论失败：评分为空')
    return Promise.reject(new Error('评分不能为空'))
  }
  
  // 构建URL查询参数
  const url = `/api/review/add.do?userId=${encodeURIComponent(data.userId)}&hotelName=${encodeURIComponent(data.hotelName)}&content=${encodeURIComponent(data.content)}&rating=${data.rating}`
  console.log('添加评论请求URL:', url)
  
  return axios.post(url, null, { withCredentials: true })
    .then(response => {
      console.log('添加评论响应:', response.data)
      return response
    })
    .catch(error => {
      console.error('添加评论失败:', error)
      throw error
    })
}

/**
 * 更新评价
 * @param data 评价数据
 * @returns 更新结果
 */
export const updateReview = (data: any) => {
  console.log('发送更新评论请求，参数:', data);
  return axiosInstance.post('/api/review/update.do', qs.stringify(data, qsOptions), {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
  })
}

/**
 * 删除评价
 * @param reviewId 评论ID
 * @returns 删除结果
 */
export const deleteReview = (reviewId: number | string) => {
  console.log('删除评论，评论ID:', reviewId)
  
  if (!reviewId) {
    console.error('删除评论失败：评论ID为空')
    return Promise.reject(new Error('评论ID不能为空'))
  }
  
  // 确保reviewId为数字类型
  const numericId = typeof reviewId === 'string' ? parseInt(reviewId, 10) : reviewId
  
  // 使用URL查询参数而不是请求体
  const url = `/api/review/delete.do?reviewId=${numericId}`
  console.log('删除评论请求URL:', url)
  
  return axios.post(url, null, { withCredentials: true })
    .then(response => {
      console.log('删除评论响应:', response.data)
      return response
    })
    .catch(error => {
      console.error('删除评论失败:', error)
      throw error
    })
}

/**
 * 获取评论的回复列表
 * @param reviewId 评论ID
 * @returns 回复列表
 */
export const getReviewReplies = (reviewId: number | string) => {
  console.log('获取评论回复，评论ID：', reviewId, '类型：', typeof reviewId)
  
  if (!reviewId) {
    console.error('获取评论回复失败：评论ID为空')
    return Promise.reject(new Error('评论ID不能为空'))
  }
  
  // 直接使用数字类型的reviewId，不使用对象形式传参
  // 尝试确保传递数字类型而非字符串
  const numericId = typeof reviewId === 'string' ? parseInt(reviewId, 10) : reviewId
  
  // 兼容性处理：尝试几种不同的参数传递方式
  return httpGet('/api/review/reply/listByReviewId.do', { reviewId: numericId })
}

/**
 * 添加评论回复
 * @param data 回复数据，包含reviewId、userId、content
 * @returns 添加结果
 */
export const addReviewReply = (data: any) => {
  console.log('添加评论回复，原始参数：', data)
  
  // 深度检查参数
  if (!data) {
    console.error('添加评论回复失败：参数为空')
    return Promise.reject(new Error('参数不能为空'))
  }
  
  if (data.reviewId === undefined || data.reviewId === null) {
    console.error('添加评论回复失败：评论ID为空')
    return Promise.reject(new Error('评论ID不能为空'))
  }
  
  if (!data.userId) {
    console.error('添加评论回复失败：用户ID为空')
    return Promise.reject(new Error('用户ID不能为空'))
  }
  
  if (!data.content || !data.content.trim()) {
    console.error('添加评论回复失败：回复内容为空')
    return Promise.reject(new Error('回复内容不能为空'))
  }

  console.log('添加回复参数，字段:', Object.keys(data))
  
  // 使用query参数而非body参数
  const url = `/api/review/reply/add.do?reviewId=${data.reviewId}&userId=${encodeURIComponent(data.userId)}&content=${encodeURIComponent(data.content)}`
  console.log('请求URL:', url)
  
  return axios.post(url, null, { withCredentials: true })
    .then(response => {
      console.log('添加回复响应:', response.data)
      return response
    })
    .catch(error => {
      console.error('添加回复失败:', error)
      throw error
    })
}

/**
 * 获取酒店的新评论通知
 * @param hotelId 酒店ID
 * @returns 评论通知列表
 */
export const getHotelReviewNotifications = (hotelId: number | string) => {
  console.log('获取酒店评论通知，酒店ID:', hotelId)
  return axios.get('/api/review/notifications.do', { 
    params: { hotelId },
    withCredentials: true
  })
}

/**
 * 标记酒店评论通知为已读
 * @param notificationId 通知ID
 * @returns 操作结果
 */
export const markReviewNotificationAsRead = (notificationId: number | string) => {
  console.log('标记评论通知已读，通知ID:', notificationId)
  const url = `/api/review/notification/read.do?notificationId=${notificationId}`
  return axios.post(url, null, { withCredentials: true })
}
